package day0113.homework;//1.抽象父类
//Object类是所有类的顶级父类
abstract class Accompany{
    int time;//系统默认给time赋值一个0
    Accompany(){}//系统会默认调用父类的无参构造方法。
    Accompany(int t){
        this.time=t;//将参数t赋值给成员变量this.time
    }

    void play(){
        System.out.println("开始播放伴奏");
    }

    abstract Object matchWords();
}



class Lullaby extends Accompany{
    //重载：名字相同，参数不同
    Lullaby(){//系统会默认调用父类的无参构造方法。
        this(0);//注意： 必须写在某个构造方法的第一行。
    }
    Lullaby(int t){
        this.time=t;//将参数t赋值给成员变量this.time
    }//用this.成员变量 格式访问成员变量(区分成员和参数)。
    //成员方法play()会从抽象父类中继承过来

    public String matchWords() {//重写抽象父类中的抽象方法
        System.out.println("睡吧睡吧我亲爱的宝贝");
        return new String("");
    }//子类对父类的某个方法重写： 名字相同，参数也要相同。
     // 基本类型返回值类型要相同，引用类型返回值类型可以是父类方法返回值类型的子类型或者相同
     // 访问控制修饰符需要比父类权限更大

    //在子类中添加一个子类独有的方法 催眠
    void forSleep(){
        System.out.println("让小婴儿睡觉的方法正在执行");
    }
}





class NationalAnthem extends Accompany{//国歌类
    NationalAnthem(){
        super();//如果这里不写内容，系统也会添加  super() 调用父类的无参构造方法
    }
    NationalAnthem(int t){
        super(t);//调用父类的有参构造方法，将参数t赋值给time，然后本类来继承
    }

    public String matchWords() {
        return new String("起来不愿做奴隶的人们.....");
    }//重写抽象父类的抽象方法。名字 参数也要相同。

    void heartStirring(){
        System.out.println("提高国民的爱国意识，提升大家的爱国情怀");
    }
}




public class Test3 {
    public static void main(String[] args) {
        Accompany  a=new Lullaby(); //向上造型:将子类型对象赋值给父类型变量
        System.out.println(a.time);;//结果？？？
        a.play();;//结果？？？//调用父类中继承的play方法//"播放伴奏..."
        a.matchWords();;//结果？？？//子类重写的matchWords方法//"睡吧睡吧我亲爱的宝贝"
        //子类 和父类都有的方法被调用，用的是哪个累的对象，就执行哪个累的方法

        //匿名类继承了国歌类
        //new关键字同时创建匿名类的对象
        NationalAnthem na=new NationalAnthem(6){
            int i=1;
            int time=60;
            public void play(){
                System.out.println("匿名内部类的play()");
            }
            public String matchWords(){
                System.out.println("匿名内部类的匹配歌词方法");
                return "匿名内部类的匹配歌词方法";
            }
        };
        //使用向上造型的对象，调用成员变量成员方法: 至少父类中需要有成员变量成员方法。
        //或者父类和子类都有.
        //System.out.println(na.i);
        System.out.println(na.time);;//结果？？？//父类是6//子类time是1
        NationalAnthem acc=new NationalAnthem();
        changeAndUseMethod(acc);//结果？？？
    }

    //将传入的参数a强制转化为子类型，调用子类中独有的方法
    private static void changeAndUseMethod(Accompany  a) {
        if(a instanceof NationalAnthem){
            NationalAnthem na= (NationalAnthem)a;
            na.heartStirring();
        }else if(a instanceof Lullaby){
            Lullaby lu= (Lullaby)a;
            lu.forSleep();
        }
    }

}









